home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / SNNSV32.ZIP / SNNSv3.2 / xgui / sources / d3_move.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-25  |  11.9 KB  |  361 lines

  1. /*****************************************************************************
  2.   FILE           : d3_move.c
  3.   SHORTNAME      : move.c
  4.   SNNS VERSION   : 3.2
  5.  
  6.   PURPOSE        : create the pannels for rotation, translation and scale
  7.   NOTES          :
  8.  
  9.   AUTHOR         : Ralf Huebner
  10.   DATE           : 1.12.1991
  11.  
  12.   CHANGED BY     :
  13.   IDENTIFICATION : @(#)d3_move.c    1.9 3/2/94
  14.   SCCS VERSION   : 1.9
  15.   LAST CHANGE    : 3/2/94
  16.  
  17.              Copyright (c) 1990-1994  SNNS Group, IPVR, Univ. Stuttgart, FRG
  18.              
  19. ******************************************************************************/
  20.  
  21.  
  22. #include <stdio.h>
  23.  
  24. #include <X11/Xlib.h>
  25. #include <X11/Xutil.h>
  26. #include <X11/Intrinsic.h>
  27. #include <X11/StringDefs.h>
  28. #include <X11/Shell.h>
  29. #include <X11/Xaw/Simple.h>
  30. #include <X11/Xaw/Box.h>
  31. #include <X11/Xaw/Form.h>
  32. #include <X11/Xaw/Toggle.h>
  33.  
  34. #include "glob_typ.h"
  35. #include "ui.h"
  36.  
  37. #include "ui_xWidgets.h"
  38. #include "d3_global.h"
  39. #include "d3_xUtils.h"
  40. #include "d3_main.h"
  41.  
  42. #include "d3_move.ph"
  43.  
  44.  
  45. /*****************************************************************************
  46.   FUNCTION : d3_transform
  47.  
  48.   PURPOSE  : sets the state vectors to a new movement
  49.   RETURNS  : new state variable
  50.   NOTES    : callback for all procedures in this module
  51.  
  52.   UPDATE   :
  53. ******************************************************************************/
  54.  
  55. static void d3_transform  (Widget w, int transformation, caddr_t call_data)
  56.  
  57. {
  58.     int i;
  59.  
  60.     if (d3_freeze) 
  61.         return;
  62.     switch (transformation) {
  63.         case ROT_X_LEFT    : d3_state.rot_vec [0] -= d3_state.rot_step [0];
  64.                              break;
  65.         case ROT_X_RIGHT   : d3_state.rot_vec [0] += d3_state.rot_step [0];
  66.                              break;
  67.         case ROT_Y_LEFT    : d3_state.rot_vec [1] -= d3_state.rot_step [1];
  68.                              break;
  69.         case ROT_Y_RIGHT   : d3_state.rot_vec [1] += d3_state.rot_step [1];
  70.                              break;
  71.         case ROT_Z_LEFT    : d3_state.rot_vec [2] -= d3_state.rot_step [2];
  72.                              break;
  73.         case ROT_Z_RIGHT   : d3_state.rot_vec [2] += d3_state.rot_step [2];
  74.                               break;
  75.         case TRANS_X_LEFT  : d3_state.trans_vec [0] -= d3_state.trans_step [0];
  76.                              break;
  77.         case TRANS_X_RIGHT : d3_state.trans_vec [0] += d3_state.trans_step [0];
  78.                              break;
  79.         case TRANS_Y_LEFT  : d3_state.trans_vec [1] -= d3_state.trans_step [1];
  80.                              break;
  81.         case TRANS_Y_RIGHT : d3_state.trans_vec [1] += d3_state.trans_step [1];
  82.                              break;
  83.         case TRANS_Z_LEFT  : d3_state.trans_vec [2] -= d3_state.trans_step [2];
  84.                              break;
  85.         case TRANS_Z_RIGHT : d3_state.trans_vec [2] += d3_state.trans_step [2];
  86.                              break;
  87.         case SCALE_PLUS    : for (i=0; i<3; i++) {
  88.                                  d3_state.scale_vec [i] *= d3_state.scale_step [0]; 
  89.                  }
  90.                              break;
  91.         case SCALE_MINUS   : for (i=0; i<3; i++) {
  92.                                  d3_state.scale_vec [i] /= d3_state.scale_step [0]; 
  93.                  }
  94.                              break;
  95.     }
  96.     d3_drawNet ();
  97. }
  98.  
  99.  
  100. /*****************************************************************************
  101.   FUNCTION : create_box_item
  102.  
  103.   PURPOSE  : creates the border box for the move pannels
  104.   RETURNS  : the box widget
  105.   NOTES    :
  106.  
  107.   UPDATE   :
  108. ******************************************************************************/
  109.  
  110. static void create_box_item (int height, int width, Widget parent, Widget left, Widget top, Widget *box)
  111.  
  112. {
  113.     int n;
  114.     Arg arg[20];
  115.   
  116.     n = 0;
  117.     XtSetArg(arg[n], XtNx, border);                        n++;
  118.     XtSetArg(arg[n], XtNy, border);                        n++;
  119.     XtSetArg(arg[n], XtNfromVert , left);                  n++;
  120.     XtSetArg(arg[n], XtNfromHoriz, top);                   n++;
  121.     XtSetArg(arg[n], XtNheight, height);                   n++;
  122.     XtSetArg(arg[n], XtNwidth, width);                     n++;
  123.     XtSetArg(arg[n], XtNleft  , XtChainLeft);              n++;
  124.     XtSetArg(arg[n], XtNright , XtChainRight);             n++;
  125.     XtSetArg(arg[n], XtNtop   , XtChainTop);               n++;
  126.     XtSetArg(arg[n], XtNbottom, XtChainBottom);            n++;
  127.     *box = XtCreateManagedWidget("box", boxWidgetClass, parent, arg, (unsigned int) n);
  128. }
  129.  
  130.  
  131. /*****************************************************************************
  132.   FUNCTION : create_scale_button
  133.  
  134.   PURPOSE  : creates a single scale button
  135.   RETURNS  : scale widget
  136.   NOTES    :
  137.  
  138.   UPDATE   :
  139. ******************************************************************************/
  140.  
  141. static void create_scale_button (char *label, Widget parent, int xsize, int ysize, Widget *button)
  142.  
  143. {
  144.     int n;
  145.     Arg arg[10];
  146.  
  147.     n = 0;
  148.     XtSetArg(arg[n], XtNx, border);                        n++;
  149.     XtSetArg(arg[n], XtNy, border);                        n++;
  150.     XtSetArg(arg[n], XtNheight, ysize);                       n++;
  151.     XtSetArg(arg[n], XtNwidth, xsize);                        n++;
  152.     XtSetArg(arg[n], XtNlabel, label);                       n++;
  153.     *button = XtCreateManagedWidget("button", commandWidgetClass, parent, arg, (unsigned int) n);
  154.  
  155. }
  156.  
  157.  
  158. /*****************************************************************************
  159.   FUNCTION : create_move_label
  160.  
  161.   PURPOSE  : creates a label for a single pannel
  162.   RETURNS  : void
  163.   NOTES    :
  164.  
  165.   UPDATE   :
  166. ******************************************************************************/
  167.  
  168. static void create_move_label (char *label, Widget parent)
  169.  
  170. {
  171.     Widget label_widget;
  172.     int n;
  173.     Arg arg[10];
  174.     int xwdth = 78;
  175.  
  176.     n = 0;
  177.     XtSetArg(arg[n], XtNborderWidth, 0); n++;
  178.     XtSetArg(arg[n], XtNwidth, xwdth);                       n++;  
  179.     XtSetArg(arg[n], XtNlabel, label);                       n++;
  180.  
  181.     XtSetArg(arg[n], XtNfromVert , NULL);  n++;
  182.     XtSetArg(arg[n], XtNfromHoriz, NULL);  n++;
  183.  
  184.     XtSetArg(arg[n], XtNleft  , XtChainLeft); n++;
  185.     XtSetArg(arg[n], XtNright , XtChainRight); n++;
  186.     XtSetArg(arg[n], XtNtop   , XtChainTop); n++;
  187.     XtSetArg(arg[n], XtNbottom, XtChainBottom); n++;
  188.  
  189.     label_widget = XtCreateManagedWidget("label", labelWidgetClass, parent, arg, (unsigned int) n);
  190.  
  191. }
  192.  
  193.  
  194. /*****************************************************************************
  195.   FUNCTION : create_move_item
  196.  
  197.   PURPOSE  : creates a single entry for the trans and rotate pannels
  198.   RETURNS  : the 'greater' and 'smaller' widgets
  199.   NOTES    :
  200.  
  201.   UPDATE   :
  202. ******************************************************************************/
  203.  
  204. static void create_move_item (char *label, Widget parent, Widget *le_widget, Widget *ge_widget)
  205.  
  206. {
  207.     Widget label_widget;
  208.     int n;
  209.     Arg arg[10];
  210.  
  211.     n = 0;
  212.     XtSetArg(arg[n], XtNx, border);                        n++;
  213.     XtSetArg(arg[n], XtNy, border);                        n++;
  214.     XtSetArg(arg[n], XtNheight, button_size);              n++;
  215.     XtSetArg(arg[n], XtNwidth, button_size);               n++;
  216.     XtSetArg(arg[n], XtNlabel, "-");                       n++;
  217.     *le_widget = XtCreateManagedWidget("le", commandWidgetClass, parent, arg, (unsigned int) n);
  218.  
  219.     n = 0;
  220.     XtSetArg(arg[n], XtNx, border);                        n++;
  221.     XtSetArg(arg[n], XtNy, border);                        n++;
  222.     XtSetArg(arg[n], XtNheight, button_size );             n++;
  223.     XtSetArg(arg[n], XtNwidth, 2 * button_size);           n++;
  224.     XtSetArg(arg[n], XtNlabel, label);                     n++;
  225.     label_widget = XtCreateManagedWidget("hot", labelWidgetClass, parent, arg, (unsigned int) n);
  226.  
  227.     n = 0;
  228.     XtSetArg(arg[n], XtNx, border);                        n++;
  229.     XtSetArg(arg[n], XtNy, border);                        n++;
  230.     XtSetArg(arg[n], XtNheight, button_size);              n++;
  231.     XtSetArg(arg[n], XtNwidth, button_size);               n++;
  232.     XtSetArg(arg[n], XtNlabel, "+");                       n++;
  233.     *ge_widget = XtCreateManagedWidget("ge", commandWidgetClass, parent, arg, (unsigned int) n);
  234.  
  235. }
  236.  
  237.  
  238. /*****************************************************************************
  239.   FUNCTION : create_rotatePannel
  240.  
  241.   PURPOSE  : creates the pannel and callbacks for the rotation
  242.   RETURNS  : void
  243.   NOTES    :
  244.  
  245.   UPDATE   :
  246. ******************************************************************************/
  247.  
  248. static void create_rotatePannel (Widget rotate_widget)
  249.  
  250. {
  251.     Widget ge_widget, le_widget;
  252.  
  253.     create_move_label ("rotate", rotate_widget);
  254.  
  255.     create_move_item (" X ", rotate_widget, &le_widget, &ge_widget);
  256.     XtAddCallback(le_widget, XtNcallback, (XtCallbackProc) d3_transform, (caddr_t) ROT_X_LEFT);
  257.     XtAddCallback(ge_widget, XtNcallback, (XtCallbackProc) d3_transform, (caddr_t) ROT_X_RIGHT);
  258.  
  259.     create_move_item (" Y ", rotate_widget, &le_widget, &ge_widget);
  260.     XtAddCallback(le_widget, XtNcallback, (XtCallbackProc) d3_transform, (caddr_t) ROT_Y_LEFT);
  261.     XtAddCallback(ge_widget, XtNcallback, (XtCallbackProc) d3_transform, (caddr_t) ROT_Y_RIGHT);
  262.  
  263.     create_move_item (" Z ", rotate_widget, &le_widget, &ge_widget);
  264.     XtAddCallback(le_widget, XtNcallback, (XtCallbackProc) d3_transform, (caddr_t) ROT_Z_LEFT);
  265.     XtAddCallback(ge_widget, XtNcallback, (XtCallbackProc) d3_transform, (caddr_t) ROT_Z_RIGHT);
  266.  
  267. }  
  268.  
  269.  
  270. /*****************************************************************************
  271.   FUNCTION : create_transPannel
  272.  
  273.   PURPOSE  : creates the pannel and callbacks for the translation
  274.   RETURNS  : void
  275.   NOTES    :
  276.  
  277.   UPDATE   :
  278. ******************************************************************************/
  279.  
  280. static void create_transPannel (Widget trans_widget)
  281.  
  282. {
  283.     Widget ge_widget, le_widget;
  284.  
  285.     create_move_label ("trans", trans_widget);
  286.  
  287.     create_move_item (" X ", trans_widget, &le_widget, &ge_widget);
  288.     XtAddCallback(le_widget, XtNcallback, (XtCallbackProc) d3_transform, (caddr_t) TRANS_X_LEFT);
  289.     XtAddCallback(ge_widget, XtNcallback, (XtCallbackProc) d3_transform, (caddr_t) TRANS_X_RIGHT);
  290.  
  291.     create_move_item (" Y ", trans_widget, &le_widget, &ge_widget);
  292.     XtAddCallback(le_widget, XtNcallback, (XtCallbackProc) d3_transform, (caddr_t) TRANS_Y_LEFT);
  293.     XtAddCallback(ge_widget, XtNcallback, (XtCallbackProc) d3_transform, (caddr_t) TRANS_Y_RIGHT);
  294.  
  295.     create_move_item (" Z ", trans_widget, &le_widget, &ge_widget);
  296.     XtAddCallback(le_widget, XtNcallback, (XtCallbackProc) d3_transform, (caddr_t) TRANS_Z_LEFT);
  297.     XtAddCallback(ge_widget, XtNcallback, (XtCallbackProc) d3_transform, (caddr_t) TRANS_Z_RIGHT);
  298.  
  299. }  
  300.  
  301.  
  302. /*****************************************************************************
  303.   FUNCTION : create_scalePannel
  304.  
  305.   PURPOSE  : creates the pannel for scale
  306.   RETURNS  : void
  307.   NOTES    :
  308.  
  309.   UPDATE   :
  310. ******************************************************************************/
  311.  
  312. static void create_scalePannel (Widget scale_widget)
  313.  
  314. {
  315.     Widget ge_widget, le_widget;
  316.     int xsize = 35, ysize = 60;
  317.  
  318.     create_move_label ("scale", scale_widget);
  319.  
  320.     create_scale_button ("-", scale_widget, xsize, ysize, &le_widget);
  321.     create_scale_button ("+", scale_widget, xsize, ysize, &ge_widget);
  322.  
  323.     XtAddCallback(ge_widget, XtNcallback, (XtCallbackProc) d3_transform, (caddr_t) SCALE_PLUS);
  324.     XtAddCallback(le_widget, XtNcallback, (XtCallbackProc) d3_transform, (caddr_t) SCALE_MINUS);
  325. }
  326.  
  327.  
  328. /*****************************************************************************
  329.   FUNCTION : d3_createMovePannel
  330.  
  331.   PURPOSE  : creates the pannels for for rotation, translation and scale
  332.   RETURNS  : void
  333.   NOTES    :
  334.  
  335.   UPDATE   :
  336. ******************************************************************************/
  337.  
  338. void d3_createMovePannel (Widget parent)
  339.  
  340. {
  341.     Widget scale, rotate, trans;
  342.     int height = 70;
  343.     int width = 100;
  344.  
  345.     create_box_item (height, width, parent, NULL, NULL, &rotate);
  346.     create_rotatePannel (rotate);
  347.  
  348.     create_box_item (height, width, parent, rotate, NULL, &trans);
  349.     create_transPannel (trans);
  350.  
  351.     create_box_item (height, width, parent, trans, NULL, &scale);
  352.     create_scalePannel (scale);
  353. }  
  354.  
  355.  
  356.  
  357.  
  358.  
  359. /* end of file */
  360. /* lines: 421 */
  361.